home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / stut_src / ecri_msg.c < prev    next >
C/C++ Source or Header  |  1996-05-27  |  10KB  |  418 lines

  1. /*
  2.  * ecri_msg.c
  3.  *
  4.  * Purpose:
  5.  * -------- 
  6.  * ecriture des messages d'une rubrique
  7.  *
  8.  * History:
  9.  * --------
  10.  * 21.01.95: fplanque: Created
  11.  */
  12.  
  13.      #include "!OPTIONS.H"                /* Options de compilation */         
  14.     #define    THIS_FILE    "ECRI_MSG.C v1.00 - 03.95"
  15.  
  16. /*
  17.  * System headers:
  18.  */
  19.     #include    <stdio.h>                    /* header standard */
  20.     #include <string.h>                    /* header tt de chaines */
  21.    
  22.  
  23. /*
  24.  * Custom headers:
  25.  */
  26.     #include "SPEC_PU.H"
  27.     #include "S_MALLOC.H"
  28.     #include "DEF_ARBO.H"
  29.     #include "DATPG_PU.H"
  30.     #include "DBSYS_PU.H"
  31.     #include    "DEBUG_PU.H"    
  32.     #include    "LISTS_PU.H"
  33.     #include    "SERV_PU.H"
  34.     #include    "LINE0_PU.H"
  35.     #include    "DBINT_PU.H"
  36.     #include    "IOFLD_PU.H"
  37.     #include "GENRC_PU.H"
  38.     #include "TERM_PU.H"
  39.     #include "TEXT_PU.H"
  40.     #include    "SERCOMPU.H"
  41.  
  42.  
  43.     static    void    Record_MessageToDB( 
  44.             VOIE *    pVoie_curr, 
  45.             BOOL        b_Private );        /* In: !=0 si le message est priv‚ */
  46.  
  47. /*
  48.  * --------------------------- METHODES -------------------------------
  49.  */
  50.  
  51. /*
  52.  * EcriMsg_ENPG(-)
  53.  *
  54.  * Purpose:
  55.  * --------
  56.  * Traitrement des initialisations ENTER PAGE
  57.  *
  58.  * History:
  59.  * --------
  60.  * 21.01.95: fplanque: Created
  61.  */
  62. void    EcriMsg_ENPG(
  63.             VOIE    *    pVoie_curr )        /* In: Voie concern‚e */
  64. {
  65.     /*
  66.      * Ouvre base de donn‚es:
  67.      */
  68.     register_action( pVoie_curr, OPDB, FB_RUB, 0, NULL ); 
  69.     /*
  70.      * Affiche donn‚es 
  71.      */
  72.     register_action( pVoie_curr, DDAT, 0, 0, NULL );
  73. }
  74.  
  75.  
  76.  
  77. /*
  78.  * EcriMsg_DispData(-)
  79.  *
  80.  * Purpose:
  81.  * --------
  82.  * Affiche les donn‚es initiales … l'‚cran:
  83.  *
  84.  * Notes:
  85.  * ------
  86.  * Ceci n'est normalement ‚x‚cut‚ qu'une seule fois … l'entr‚e de la page
  87.  *
  88.  * History:
  89.  * --------
  90.  * 10.01.95: fplanque: Created based on LectMsg_DispData()
  91.  * 24.01.95: appel de OutFields_DisplayGroup()
  92.  */
  93. void    EcriMsg_DispData(
  94.             VOIE *    pVoie_curr )    /* In: Voie concern‚e */
  95. {
  96.     /*
  97.      * Affichage champs groupe 1 (commentaire...):
  98.      */
  99.     OutFields_DisplayGroup( pVoie_curr, 1, 0, 0 );
  100. }
  101.  
  102.  
  103.  
  104.  
  105. /*
  106.  * keyaction_ecri_msg(-)
  107.  *
  108.  * Purpose:
  109.  * --------
  110.  * R‚agit … la touche press‚ sur une page d'ECRITURE
  111.  *
  112.  * History:
  113.  * --------
  114.  * 1993: fplanque: Created
  115.  * 27.11.94: fplanque: gestion du champ TITLE
  116.  * 05.12.94: utilise Move_FocusTo...
  117.  * 09.12.94: envoi peut valider depuis n'importe kel champ, gestion suite/retour normal
  118.  * 13.12.94: prise en compte de Private
  119.  */
  120. void    keyaction_ecri_msg(
  121.             KEYCODE    curr_keypress,     /* In: touche press‚e */
  122.             VOIE     *    pVoie_curr )        /* In: voie concern‚e */
  123. {
  124.     switch( curr_keypress )
  125.     {
  126.         case    KEY_ENVOI:                
  127.         {
  128.             BOOL                b_Private = FALSE0;    /* Par d‚faut, le message est public */
  129.             const char *    cpsz_PublicPrivate;
  130.         
  131.             /*
  132.              * V‚rifie si le mec tape un mot clef:
  133.              */
  134.             if( serv_handleKeyword( pVoie_curr, '*' ) )
  135.             {
  136.                 break;
  137.             }
  138.  
  139.             /*
  140.              * On a pas tap‚ un mot clef:
  141.              * On traite envoi comme une validation du msg:
  142.              * Controle si on peut enregistrer: 
  143.              */
  144.             if( pVoie_curr -> nb_records >= 1 )        /* Limite … 1 enregistrement */
  145.             {    /*
  146.                  * Enregistrement impossible:
  147.                  */
  148.                 aff_msg_l0( pVoie_curr, "Duplicata interdit!" );
  149.                 break;
  150.             }
  151.         
  152.             /*
  153.              * V‚rifie si les champs sont correctement remplis:
  154.              */
  155.             if( ! validate_InFields( pVoie_curr ) )
  156.             {
  157.                 break;
  158.             } 
  159.  
  160.             /*
  161.              * D‚termine si le message est priv‚:
  162.              */
  163.              cpsz_PublicPrivate = aim_InField( pVoie_curr, FEI_PUBPRIV );
  164.             if( cpsz_PublicPrivate != NULL && (cpsz_PublicPrivate[0] == 'V' || cpsz_PublicPrivate[0] == 'v'))
  165.             {    /*
  166.                  * Le message est priv‚:
  167.                  */
  168.                 const char *    cpsz_Destinataire;
  169.  
  170.                 b_Private = TRUE_1;
  171.  
  172.                 /*
  173.                  * On v‚rifie qu'on a sp‚cifi‚ un destinataire:
  174.                  */
  175.                  cpsz_Destinataire = aim_InField( pVoie_curr, FEI_DEST );
  176.                 if( cpsz_Destinataire == NULL || cpsz_Destinataire[0] == '\0' ) 
  177.                 {    /*
  178.                      * Message priv‚ sans destinataire:
  179.                      */
  180.                     aff_msg_l0( pVoie_curr, "Msg Priv‚ sans Destinataire!" );
  181.                     Move_FocusToInField_byFnct( pVoie_curr, FEI_DEST, FEI_DEST );
  182.                     break;
  183.                 }
  184.                 
  185.             }
  186.  
  187.             /*
  188.               * On va enregister: 
  189.              */
  190.             affiche_touche( pVoie_curr, curr_keypress );        /* Affiche nom de la touche */
  191.             add_textinf( pVoie_curr -> wi_params, "   Enregistrement du message" );
  192.             aff_msg_l0( pVoie_curr, "Enregistrement du message." );
  193.  
  194.             /*
  195.               * ----------------------------------
  196.              * Enregistrement des champs ‚dit‚es:
  197.               * ----------------------------------
  198.              */
  199.             Record_MessageToDB( pVoie_curr, b_Private );
  200.  
  201.             /*
  202.              * Demande Changement de page:
  203.              */
  204.             follow_KeyArboLink( pVoie_curr, curr_keypress );
  205.         }
  206.             break;
  207.  
  208.  
  209.         case    KEY_SUITE:
  210.             Move_FocusToNextInField( pVoie_curr );
  211.             break;
  212.  
  213.         case    KEY_RETOUR:
  214.             Move_FocusToPrevInField( pVoie_curr );
  215.             break;
  216.  
  217.         case    KEY_GUIDE:
  218.             /*
  219.              * test:
  220.              */
  221.             /*    InField_Clear( pVoie_curr, pVoie_curr -> pIOField_CurrIn ); */
  222.             
  223.         case    KEY_REPET:
  224.         case    KEY_SOMM:
  225.             affiche_touche( pVoie_curr, curr_keypress );        /* Affiche nom de la touche */
  226.             /*
  227.              * Demande Changement de page:
  228.              */
  229.             follow_KeyArboLink( pVoie_curr, curr_keypress );
  230.             break;
  231.  
  232.     }
  233. }
  234.  
  235.  
  236.  
  237. /*
  238.  * Record_MessageToDB(-)
  239.  *
  240.  * Purpose:
  241.  * --------
  242.  * Enregistrement un message ‚dit‚
  243.  * ex: message en rubrique
  244.  * G‚n‚ralement aprŠs appui sur ENVOI!
  245.  *
  246.  * Algorythm:
  247.  * ----------  
  248.  *
  249.  * Notes:
  250.  * ------
  251.  *
  252.  * History:
  253.  * --------
  254.  * 1993: fplanque: Created
  255.  * 17.05.94: fplanque: initialise Locks lors de la cr‚ation du message
  256.  * 16.11.94: ajoute du champ MPSE
  257.  * 18.11.94: DSTA prend nom de la rub comme destinataire
  258.  * 29.11.94: nouveau systeme de cr‚ation de fields
  259.  * 01.12.94: cr‚ation titre
  260.  * 14.12.94 gestion d'un destinataire particulier
  261.  */
  262. void    Record_MessageToDB( 
  263.             VOIE *    pVoie_curr, 
  264.             BOOL        b_Private )        /* In: !=0 si le message est priv‚ */
  265. {
  266.     IOFIELD            *    pInField;
  267.  
  268.     RECORD_FIELD     *    pListElt_First;
  269.     RECORD_FIELD     *    pListElt_New;
  270.     RECORD_FIELD     *    pListElt_Prev = NULL;
  271.     
  272.     COMPACT_RECORD    *    pCompRec;            /* Message compact‚ */
  273.     DATAPAGE            *    pDataPage_DB = pVoie_curr -> database;    /* Base de donn‚es concern‚e */
  274.     char                *    pisz_tmp;
  275.     
  276.     /*
  277.      * +---------------------------------------------------+ 
  278.      * |  Cr‚ation des champs du message en liste chain‚e  |
  279.      * +---------------------------------------------------+ 
  280.      * ----
  281.      * HEAD
  282.      * ----
  283.      */
  284.     pListElt_New    = Create_HeaderFld( &G_RecNb_Null, b_Private );
  285.     pListElt_Prev    = Append_ToSingleLinkList( pListElt_Prev, pListElt_New );
  286.     pListElt_First    = pListElt_Prev;
  287.  
  288.     /*
  289.      * ----
  290.      * DSTA
  291.      * ----
  292.      */
  293.     strcpy( G_tmp_buffer, "ALL" );    /* Par d‚faut */
  294.  
  295.     if( get_InFieldPars( pVoie_curr, FEI_DEST, &pInField ) == FLD_READY )
  296.     {    /*
  297.          * Le message est adress‚ … une personne en particulier:
  298.          */
  299.         char * pMsz_Dest;
  300.         compact_text( pInField -> pTextInfo -> firstline -> next, FMTMODE_SGLETEXTLINE, &pMsz_Dest );
  301.           
  302.         if( pMsz_Dest[0] != '\0' )
  303.         {    /*
  304.              * Si un destinataire a ‚t‚ sp‚cifi‚:
  305.              */
  306.             strcpy( G_tmp_buffer, pMsz_Dest );
  307.         }
  308.         
  309.         FREE( pMsz_Dest );
  310.     }
  311.  
  312.     strcat( G_tmp_buffer, "@" );
  313.     strcat( G_tmp_buffer, pDataPage_DB -> nom );    /* Nom de la rubrique */
  314.     pisz_tmp = strBchr( G_tmp_buffer, '.' );
  315.     if( pisz_tmp != NULL )
  316.     {    /* 
  317.          * Efface l'extension (… partir du point)
  318.          */
  319.         *pisz_tmp = '\0'; 
  320.     }
  321.     strcat( G_tmp_buffer, ".RUB.LOCAL" );    /* Localisation */
  322.     /*
  323.      * Cr‚e champ DSTA:
  324.      */
  325.     pListElt_New = Create_SimpleRecFld( 'DSTA', G_tmp_buffer );
  326.     pListElt_Prev = Append_ToSingleLinkList( pListElt_Prev, pListElt_New );
  327.  
  328.  
  329.     /*
  330.      * ----
  331.      * MPSE
  332.      * CTCA
  333.      * ----
  334.      */
  335.     if( pVoie_curr -> pMsz_Login != NULL )
  336.     {
  337.         pListElt_New = Create_SimpleRecFld( 'MPSE', pVoie_curr -> pMsz_Login );
  338.         pListElt_Prev = Append_ToSingleLinkList( pListElt_Prev, pListElt_New );
  339.  
  340.         pListElt_New = Create_SimpleRecFld( 'CTCA', pVoie_curr -> pMsz_Login );
  341.         pListElt_Prev = Append_ToSingleLinkList( pListElt_Prev, pListElt_New );
  342.     }
  343.  
  344.  
  345.     /*
  346.      * ----
  347.      * MTIT
  348.      * ----
  349.      */
  350.     if( get_InFieldPars( pVoie_curr, FEI_TITLE, &pInField ) == FLD_READY )
  351.     {
  352.         pListElt_New     = Create_TextRecFld( 'MTIT', pInField );
  353.         pListElt_Prev     = Append_ToSingleLinkList( pListElt_Prev, pListElt_New );
  354.     }
  355.  
  356.  
  357.     /*
  358.      * ----
  359.      * MTXT
  360.      * ----
  361.     * Trouve 1ere ligne du texte
  362.      */
  363.     if( get_InFieldPars( pVoie_curr, FEI_TEXT, &pInField ) == FLD_READY )
  364.     {
  365.         pListElt_New     = Create_TextRecFld( 'MTXT', pInField );
  366.         pListElt_Prev     = Append_ToSingleLinkList( pListElt_Prev, pListElt_New );
  367.     }
  368.  
  369.  
  370.     /*
  371.      * ----
  372.      * FOOT
  373.      * ----
  374.      */
  375.     pListElt_New    = Create_FooterFld( );
  376.     pListElt_Prev    = Append_ToSingleLinkList( pListElt_Prev, pListElt_New );
  377.     
  378.  
  379.     /*
  380.      * +----------------------------------+
  381.      * |  Composition du message complet  |
  382.      * +----------------------------------+
  383.      */
  384.     pCompRec = Create_CompactRecord( pListElt_First );
  385.  
  386.  
  387.     /*
  388.      * +------------------------------------+
  389.      * | LibŠre liste de champs temporaires |
  390.      * +------------------------------------+
  391.      */
  392.     pListElt_New = pListElt_First;
  393.     while( pListElt_New != NULL )
  394.     {
  395.         pListElt_Prev = pListElt_New;
  396.         pListElt_New = pListElt_New -> next;
  397.         
  398.         FREE( pListElt_Prev -> info.string );
  399.         FREE( pListElt_Prev );    
  400.     }
  401.  
  402.     
  403.     /*
  404.      * +----------------------------------------------------+ 
  405.      * |  Insertion de ce message dans la base de donn‚es:  |
  406.      * +----------------------------------------------------+
  407.      */
  408.     DBInt_AppendCompRecToDB( pVoie_curr, pCompRec, pDataPage_DB );
  409.  
  410.  
  411.     /*
  412.      * Un enregistrement de plus d'effectu‚ sur cette page arbo: 
  413.      */
  414.     pVoie_curr -> nb_records ++ ;
  415.  
  416. }
  417.  
  418.